package com.example.study2.constructor;

import java.util.ArrayList;

/**
 * 演示深拷贝解决方案
 */
public class DeepCopySolution {
    public static void main(String[] args) {
        // 创建原始列表，包含可变对象
        ArrayList<StringBuilder> original = new ArrayList<>();
        original.add(new StringBuilder("数据1"));
        original.add(new StringBuilder("数据2"));

        // 执行深拷贝：创建完全独立的对象副本
        ArrayList<StringBuilder> deepCopy = createDeepCopy(original);

        System.out.println("=== 修改前 ===");
        System.out.println("原始列表内容: " + getContents(original));
        System.out.println("深拷贝内容: " + getContents(deepCopy));
        System.out.println("两个列表是否包含相同对象？ " +
                (original.get(0) == deepCopy.get(0))); // 验证是不同对象

        // 测试修改：只应影响原始列表
        original.get(0).append(" - 仅原始修改");

        System.out.println("=== 修改后 ===");
        System.out.println("原始列表内容: " + getContents(original));
        System.out.println("深拷贝内容: " + getContents(deepCopy));
        System.out.println("✅ 成功：只有原始列表发生变化，深拷贝保持独立");
    }

    /**
     * 深拷贝实现方法
     * @param source 源列表
     * @return 包含独立对象副本的新列表
     */
    private static ArrayList<StringBuilder> createDeepCopy(ArrayList<StringBuilder> source) {
        ArrayList<StringBuilder> copy = new ArrayList<>(source.size()); // 预分配容量
        for (StringBuilder sb : source) {
            // 关键步骤：创建新StringBuilder对象并复制内容
            // 这样每个列表都有自己独立的对象
            copy.add(new StringBuilder(sb.toString()));
        }
        return copy;
    }

    /**
     * 辅助方法：获取列表内容
     */
    private static ArrayList<String> getContents(ArrayList<StringBuilder> list) {
        ArrayList<String> contents = new ArrayList<>();
        for (StringBuilder sb : list) {
            contents.add(sb.toString());
        }
        return contents;
    }
}